/*******************************************************************************
** 文件名称：gpio.c
** 文件作用：GPIO操作源文件
** 编写作者：TomFree <付瑞彪>
** 编写时间：2019-12-20
** 文件备注：
**
** 更新记录：
**           2019-12-20 -> 创建文件                                 <Tom Free>
**
**           1 Tab == 4 Spaces     UTF-8     ANSI C Language
*******************************************************************************/

#include "gpio.h"
#include "chip.h"

/******************************************************
* 函 数 名：GPIO_DeInit(GPIO Port)
* 功    能：复位指定的端口寄存器
* 传入参数：Port：PA、PB......(以器件为准)
* 传出参数：无
* 使用举例：GPIO_DeInit(PA);
*******************************************************/
void GPIO_DeInit(GPIO Port)
{
    /* 复位数据输入寄存器 */
    Port->PIN = 0x00;
    /* 复位方向选择寄存器 */
    Port->DDR = 0x00;
    /* 复位数据输出寄存器 */
    Port->PORT = 0x00;
}

/******************************************************
* 函 数 名：GPIO_PinInit(GPIO Port,PIN Pin,CONFIG Config)
* 功    能：初始化指定的端口的指定引脚
* 传入参数：Port：PA、PB......(以器件为准)
*           Pin ：0......7(以器件为准)
*           Config:INPUT、OUTPUT、HIGH、LOW、REN、RDIS
*                  (其中RDIS和REN与INPUT配合使用,HIGH和
*                   LOW与OUTPUT配合使用,之间用"|"连接)
* 传出参数：无
* 使用举例：GPIO_PinInit(PA,0,INPUT|REN);
*******************************************************/
void GPIO_PinInit(GPIO Port, GPIO_PIN Pin, GPIO_CONFIG Config)
{
    /* 初始化端口方向选择寄存器 */
    if (Config & 0x02)  Port->DDR |= (1 << Pin);
    else                Port->DDR &= ~(1 << Pin);
    /* 初始化端口数据输出(上拉电阻使能)寄存器 */
    if (Config & 0x01)  Port->PORT |= (1 << Pin);
    else                Port->PORT &= ~(1 << Pin);
}

/******************************************************
* 函 数 名：GPIO_PinSet(GPIO Port,PIN Pin,CONFIG Config)
* 功    能：设置指定端口的指定引脚的输出电平
* 传入参数：Port：PA、PB......(以器件为准)
*           Pin ：0......7(以器件为准)
*           Config:HIGH、LOW
* 传出参数：无
* 使用举例：GPIO_PinSet(PA,0,LOW);
*******************************************************/
void GPIO_PinSet(GPIO Port, GPIO_PIN Pin, GPIO_CONFIG Config)
{
    /* 设置端口数据输出寄存器 */
    if (Config & 0x01) Port->PORT |= (1 << Pin);
    else 			   Port->PORT &= ~(1 << Pin);
}

/******************************************************
* 函 数 名：GPIO_PinGet(GPIO Port,PIN Pin)
* 功    能：获得指定端口的指定引脚的输入电平
* 传入参数：Port：PA、PB......(以器件为准)
*           Pin ：0......7(以器件为准)
* 传出参数：相应端口输入电平(HIGH或LOW)
* 使用举例：a = GPIO_PinGet(PA,0);
*******************************************************/
GPIO_LEVEL GPIO_PinGet(GPIO Port, GPIO_PIN Pin)
{
    /* 获取相应端口数据输入寄存器某一位的电平 */
    return ((Port->PIN&(1 << Pin)) ? GPIO_HIGH : GPIO_LOW);
}

/******************************************************
* 函 数 名：GPIO_PinTurn(GPIO Port,PIN Pin)
* 功    能：翻转指定端口的指定引脚的输出电平
* 传入参数：Port：PA、PB......(以器件为准)
*           Pin ：0......7(以器件为准)
* 传出参数：无
* 使用举例：GPIO_PinTurn(PA,0);
*******************************************************/
void GPIO_PinTurn(GPIO Port,GPIO_PIN Pin)
{
	/* 将指定端口数据输出寄存器的某一位取反 */
	Port->PORT^=(1<<Pin);
}

/******************************************************
* 函 数 名：GPIO_PortInit(GPIO Port,CONFIG Config)
* 功    能：初始化指定端口(8位)
* 传入参数：Port：PA、PB......(以器件为准)
*           Config：8位无符号配置字节
* 传出参数：无
* 使用举例：GPIO_PortInit(PA,0xff);
*******************************************************/
void GPIO_PortInit(GPIO Port,GPIO_CONFIG Config)
{
	/* 设置指定端口方向选择寄存器 */
	Port->DDR=Config;
}

/******************************************************
* 函 数 名：GPIO_PortRSel(GPIO Port,CONFIG Config)
* 功    能：设置指定端口上拉电阻(仅对输入端口有效)
* 传入参数：Port：PA、PB......(以器件为准)
*           Config：8位无符号配置字节
* 传出参数：无
* 使用举例：GPIO_PortRsel(PA,0x04);
*******************************************************/
void GPIO_PortRSel(GPIO Port,GPIO_CONFIG Config)
{
	/* 设置指定端口上拉电阻使能寄存器 */
	Port->PORT=Config;
}

/******************************************************
* 函 数 名：GPIO_PortSet(GPIO Port,CONFIG Config)
* 功    能：设置指定端口输出电平(8位)
* 传入参数：Port：PA、PB......(以器件为准)
*           Config：8位无符号输出数据字节
* 传出参数：无
* 使用举例：GPIO_PortSet(PA,0xf7);
*******************************************************/
void GPIO_PortSet(GPIO Port,GPIO_CONFIG Config)
{
	/* 设置指定端口数据输出寄存器 */
	Port->PORT=Config;
}

/******************************************************
* 函 数 名：GPIO_PortGet(GPIO Port)
* 功    能：获得指定端口输入电平(8位)
* 传入参数：Port：PA、PB......(以器件为准)
* 传出参数：指定端口的输入电平值(8位)
* 使用举例：a = GPIO_PortGet(PA,0xf7);
*******************************************************/
GPIO_CONFIG GPIO_PortGet(GPIO Port)
{
	/* 获得指定端口数据输入寄存器的值 */
	return (Port->PIN);
}

#if (CHIP_TYPE == 128)
/*******************************************************************************
** 函数名称：GPIOF_PinInit
** 函数作用：初始化PF类脚
** 输入参数：pin - 脚位
**          Config - 配置
** 输出参数：无
** 使用范例：GPIOF_PinInit(5, GPIO_OUTPUT);
** 函数备注：
*******************************************************************************/
void GPIOF_PinInit(GPIO_PIN Pin, GPIO_CONFIG Config)
{
    /* 初始化端口方向选择寄存器 */
    if (Config & 0x02)  DDRF |= (1 << Pin);
    else                DDRF &= ~(1 << Pin);
    /* 初始化端口数据输出(上拉电阻使能)寄存器 */
    if (Config & 0x01)  PORTF |= (1 << Pin);
    else                PORTF &= ~(1 << Pin);
}

/*******************************************************************************
** 函数名称：GPIOF_PinSet
** 函数作用：设置PF类脚
** 输入参数：pin - 脚位
**          Config - 配置
** 输出参数：无
** 使用范例：GPIOF_PinSet(5, GPIO_HIGH);
** 函数备注：
*******************************************************************************/
void GPIOF_PinSet(GPIO_PIN Pin, GPIO_CONFIG Config)
{
    if (Config) PORTF |= (1 << Pin);
    else        PORTF &= ~(1 << Pin);
}

/*******************************************************************************
** 函数名称：GPIOF_PinGet
** 函数作用：读取PF类脚
** 输入参数：pin - 脚位
** 输出参数：电平值
** 使用范例：GPIOF_PinGet(5);
** 函数备注：
*******************************************************************************/
GPIO_LEVEL GPIOF_PinGet(GPIO_PIN Pin)
{
    /* 获取相应端口数据输入寄存器某一位的电平 */
    return ((PINF&(1 << Pin)) ? GPIO_HIGH : GPIO_LOW);
}

/*******************************************************************************
** 函数名称：GPIOF_PinTurn
** 函数作用：翻转PF类脚
** 输入参数：pin - 脚位
** 输出参数：无
** 使用范例：GPIOF_PinTurn(5);
** 函数备注：
*******************************************************************************/
void GPIOF_PinTurn(GPIO_PIN Pin)
{
    /* 将指定端口数据输出寄存器的某一位取反 */
    PORTF ^= (1 << Pin);
}

#endif  /* CHIP_TYPE == 128 */
